#!/usr/bin/env python
"""
Pillow图片处理功能测试和示例

本文件演示了如何使用Pillow进行各种图片处理操作，
包括图片上传、验证、压缩、缩略图生成等功能。

运行方式：
python image_processing_demo.py
"""

import os
import sys
from PIL import Image, ImageOps, ImageFilter, ImageEnhance
import io

# 设置Django环境
sys.path.append('.')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_drf.settings')

import django
django.setup()

from api_examples.models import Product, Category
from django.contrib.auth.models import User


def create_sample_image():
    """创建一个示例图片用于测试"""
    # 创建一个简单的测试图片
    img = Image.new('RGB', (800, 600), color='skyblue')

    # 添加一些内容
    from PIL import ImageDraw, ImageFont
    draw = ImageDraw.Draw(img)

    # 绘制一些几何图形
    draw.rectangle([100, 100, 300, 200], fill='red', outline='black', width=3)
    draw.ellipse([400, 150, 600, 350], fill='green', outline='blue', width=3)
    draw.line([50, 50, 750, 550], fill='purple', width=5)

    # 添加文字
    try:
        # 尝试使用系统字体
        font = ImageFont.truetype("arial.ttf", 40)
    except:
        font = ImageFont.load_default()

    draw.text((250, 450), "DRF图片处理测试", fill='black', font=font)

    # 保存示例图片
    if not os.path.exists('media/products'):
        os.makedirs('media/products', exist_ok=True)

    img.save('media/products/sample_image.jpg', 'JPEG', quality=95)
    print("✅ 示例图片已创建: media/products/sample_image.jpg")

    return img


def demo_image_validation():
    """演示图片验证功能"""
    print("\n🔍 图片验证功能演示:")

    # 创建测试图片
    img = create_sample_image()

    # 验证图片格式
    print(f"   - 图片格式: {img.format}")
    print(f"   - 图片模式: {img.mode}")
    print(f"   - 图片尺寸: {img.size}")

    # 检查是否有透明度
    has_transparency = img.mode in ('RGBA', 'LA', 'P')
    print(f"   - 是否有透明度: {has_transparency}")

    # 模拟文件大小检查
    buffer = io.BytesIO()
    img.save(buffer, format='JPEG')
    file_size = len(buffer.getvalue())
    print(f"   - 文件大小: {file_size / 1024:.2f} KB")

    # 验证尺寸限制
    max_width, max_height = 2000, 2000
    if img.width > max_width or img.height > max_height:
        print(f"   ❌ 图片尺寸超出限制 ({max_width}x{max_height})")
    else:
        print(f"   ✅ 图片尺寸符合要求")


def demo_image_compression():
    """演示图片压缩功能"""
    print("\n📦 图片压缩功能演示:")

    # 加载原始图片
    original_path = 'media/products/sample_image.jpg'
    with Image.open(original_path) as img:
        original_size = os.path.getsize(original_path)
        print(f"   - 原始文件大小: {original_size / 1024:.2f} KB")
        print(f"   - 原始尺寸: {img.size}")

        # 不同质量的压缩
        qualities = [95, 85, 70, 50]

        for quality in qualities:
            compressed_path = f'media/products/compressed_{quality}.jpg'
            img.save(compressed_path, 'JPEG', quality=quality, optimize=True)

            compressed_size = os.path.getsize(compressed_path)
            compression_ratio = (1 - compressed_size / original_size) * 100

            print(f"   - 质量 {quality}%: {compressed_size / 1024:.2f} KB (压缩 {compression_ratio:.1f}%)")


def demo_thumbnail_generation():
    """演示缩略图生成功能"""
    print("\n🖼️  缩略图生成功能演示:")

    original_path = 'media/products/sample_image.jpg'
    with Image.open(original_path) as img:
        # 自动调整图片方向
        img = ImageOps.exif_transpose(img)

        # 生成不同尺寸的缩略图
        thumbnail_sizes = [
            (150, 150, "小尺寸"),
            (300, 300, "中尺寸"),
            (600, 600, "大尺寸")
        ]

        for width, height, desc in thumbnail_sizes:
            # 创建缩略图
            thumbnail = img.copy()
            thumbnail.thumbnail((width, height), Image.Resampling.LANCZOS)

            # 保存缩略图
            thumb_path = f'media/products/thumb_{width}x{height}.jpg'
            thumbnail.save(thumb_path, 'JPEG', optimize=True, quality=85)

            # 输出信息
            actual_size = thumbnail.size
            file_size = os.path.getsize(thumb_path)
            print(f"   - {desc} ({width}x{height}): 实际尺寸 {actual_size}, 文件大小 {file_size / 1024:.2f} KB")


def demo_image_effects():
    """演示图片特效处理"""
    print("\n✨ 图片特效处理演示:")

    original_path = 'media/products/sample_image.jpg'
    with Image.open(original_path) as img:

        # 1. 模糊效果
        blurred = img.filter(ImageFilter.GaussianBlur(radius=2))
        blurred.save('media/products/effect_blurred.jpg')
        print("   ✅ 模糊效果已生成")

        # 2. 锐化效果
        sharpened = img.filter(ImageFilter.SHARPEN)
        sharpened.save('media/products/effect_sharpened.jpg')
        print("   ✅ 锐化效果已生成")

        # 3. 边缘检测
        edges = img.filter(ImageFilter.FIND_EDGES)
        edges.save('media/products/effect_edges.jpg')
        print("   ✅ 边缘检测效果已生成")

        # 4. 调整亮度
        enhancer = ImageEnhance.Brightness(img)
        brightened = enhancer.enhance(1.3)  # 增加30%亮度
        brightened.save('media/products/effect_brightened.jpg')
        print("   ✅ 亮度调整效果已生成")

        # 5. 调整对比度
        enhancer = ImageEnhance.Contrast(img)
        contrasted = enhancer.enhance(1.2)  # 增加20%对比度
        contrasted.save('media/products/effect_contrasted.jpg')
        print("   ✅ 对比度调整效果已生成")

        # 6. 调整饱和度
        enhancer = ImageEnhance.Color(img)
        saturated = enhancer.enhance(1.5)  # 增加50%饱和度
        saturated.save('media/products/effect_saturated.jpg')
        print("   ✅ 饱和度调整效果已生成")


def demo_image_analysis():
    """演示图片分析功能"""
    print("\n🔬 图片分析功能演示:")

    original_path = 'media/products/sample_image.jpg'
    with Image.open(original_path) as img:

        # 基本信息
        print(f"   - 文件路径: {original_path}")
        print(f"   - 图片格式: {img.format}")
        print(f"   - 图片模式: {img.mode}")
        print(f"   - 图片尺寸: {img.size}")
        print(f"   - 图片大小: {os.path.getsize(original_path) / 1024:.2f} KB")

        # 颜色分析
        try:
            # 获取主要颜色
            colors = img.convert('RGB').getcolors(maxcolors=256*256*256)
            if colors:
                # 按使用频率排序
                colors.sort(reverse=True)
                print(f"   - 颜色数量: {len(colors)}")
                print(f"   - 主要颜色: {colors[0][1] if colors else 'Unknown'}")

                # 判断图片复杂度
                is_simple = len(colors) < 256
                print(f"   - 图片复杂度: {'简单' if is_simple else '复杂'}")
        except:
            print("   - 颜色分析失败")

        # EXIF信息
        if hasattr(img, '_getexif') and img._getexif():
            exif = img._getexif()
            print(f"   - EXIF信息: 包含 {len(exif)} 项数据")
        else:
            print("   - EXIF信息: 无")


def demo_database_integration():
    """演示数据库集成功能"""
    print("\n💾 数据库集成功能演示:")

    try:
        # 创建测试用户和分类
        user, created = User.objects.get_or_create(
            username='image_test_user',
            defaults={'email': 'test@example.com'}
        )
        if created:
            user.set_password('testpass123')
            user.save()

        category, created = Category.objects.get_or_create(
            name='图片测试分类',
            defaults={'description': '用于测试图片功能的分类'}
        )

        # 创建产品
        product, created = Product.objects.get_or_create(
            name='图片测试产品',
            defaults={
                'description': '这是一个用于测试图片功能的产品',
                'price': 99.99,
                'category': category,
                'status': 'active',
                'stock': 10,
                'created_by': user
            }
        )

        print(f"   ✅ 测试产品已创建: {product.name} (ID: {product.id})")
        print(f"   📝 您可以使用以下API测试图片功能:")
        print(f"      - 上传图片: POST /api/products/{product.id}/upload-image/")
        print(f"      - 压缩图片: POST /api/products/{product.id}/resize-image/")
        print(f"      - 图片信息: GET /api/products/{product.id}/image-info/")
        print(f"      - 缩略图: GET /api/products/{product.id}/thumbnail/?width=300&height=300")

    except Exception as e:
        print(f"   ❌ 数据库操作失败: {e}")


def main():
    """主函数"""
    print("🎨 Django REST Framework + Pillow 图片处理功能演示")
    print("=" * 60)

    try:
        # 创建示例图片
        create_sample_image()

        # 演示各种功能
        demo_image_validation()
        demo_image_compression()
        demo_thumbnail_generation()
        demo_image_effects()
        demo_image_analysis()
        demo_database_integration()

        print("\n🎉 所有演示完成！")
        print("\n📚 学习要点:")
        print("1. 图片验证: 检查格式、大小、尺寸等")
        print("2. 图片压缩: 不同质量级别的压缩")
        print("3. 缩略图生成: 自动生成不同尺寸的缩略图")
        print("4. 图片特效: 模糊、锐化、亮度调整等")
        print("5. 图片分析: 获取图片的详细信息")
        print("6. 数据库集成: 将图片处理与Django模型结合")

        print(f"\n📁 生成的文件保存在: media/products/ 目录")

    except Exception as e:
        print(f"❌ 演示过程中出现错误: {e}")
        import traceback
        traceback.print_exc()


if __name__ == '__main__':
    main()
